package com.store.orm.util;

/**
 * 字段工具类，主要是为了解决MySQL数据库表和Java实体类字段对应问题
 *
 * @author 宫静雨
 * @version 1.0
 */
public class FieldUtil {
    /**
     * A == 65;  a == 97
     * POJO 类字段转为数据库表字段
     *
     * @param str 传入一个pojo类的字段
     * @return 返回一个数据库表中的字段
     */
    public static String pojoToMysql(String str) {
        char[] chars = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] >= 'A' && chars[i] <= 'Z') {
                sb.append("_").append(Character.toLowerCase(chars[i]));
            } else {
                sb.append(chars[i]);
            }
        }
        return sb.toString();
    }

    /**
     * 数据库的字段转为 POJO字段
     *
     * @param str 传入一个数据库表中的字段
     * @return 返回一个POJO类中的字段
     */
    public static String mysqlToPojo(String str) {
        char[] chars = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '_') {
                sb.append(Character.toUpperCase(chars[++i]));
            } else {
                sb.append(chars[i]);
            }
        }
        return sb.toString();
    }

    /**
     * @param str 需要转换的字符串
     * @return 驼峰规则的字符串
     */
    public static String hump(String str) {
        if (str.contains("_")) {
            // user_info -> UserInfo
            return hump1(str);
        } else {
            // UserInfo -> user_info
            return hump2(str);
        }
    }

    private static String hump2(String str) {
        char[] chars = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        if (chars[0] >= 'A' && chars[0] <= 'Z') {
            chars[0] += 32;
        }
        sb.append(chars[0]);
        for (int i = 1; i < chars.length; i++) {
            if (chars[i] >= 'A' && chars[i] <= 'Z') {
                sb.append("_");
                chars[i] += 32;
            }
            sb.append(chars[i]);
        }
        return sb.toString();
    }

    private static String hump1(String str) {
        if (str.indexOf("_") + 1 == str.length()) {
            return firstUpper(str).replace("_", "");
        }
        StringBuilder sb = new StringBuilder();
        char[] chars = str.toCharArray();
        chars[0] -= 32;
        sb.append(chars[0]);
        for (int i = 1; i < chars.length; i++) {
            if (chars[i] == '_') {
                chars[++i] -= 32;
            }
            sb.append(chars[i]);
        }
        return sb.toString();
    }

    public static String firstUpper(String str) {
        char[] chars = str.toCharArray();
        chars[0] -= 32;
        return new String(chars);
    }

    public static String firstLower(String str) {
        char[] chars = str.toCharArray();
        chars[0] += 32;
        return new String(chars);
    }
}